﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using Gfw.BLL.Basic.Stock.Enums;
//using Gfw.BLL.Basic.Stock.Facilities;
//using Gfw.Models.Stock;
//using Gfw.Repositories.Stock;
//using Gfw.Repository;
//using Gfw.Stock.Base;

//namespace Gfw.BLL.Basic.Stock
//{
//    public static class TradeManager
//    {
//        #region 变量和属性
//        private static object waitLock = new object();
//        private static object excuteLock = new object();
//        private static object cancelLock = new object();
//        private static bool waitExecute = false;

//        private static bool WaitExecute
//        {
//            get
//            {
//                lock (waitLock)
//                {
//                    return TradeManager.waitExecute;
//                }
//            }
//            set
//            {
//                lock (waitLock)
//                {
//                    TradeManager.waitExecute = value;

//                }
//            }
//        }



//        #endregion

//        #region 公开的方法

//        public static void Execute()
//        {
//            if (WaitExecute == false)
//            {
//                WaitExecute = true;
//                _Execute();
//            }
//        }

//        //涨价，0.000
//        public static void UpPrice()
//        {
//            _UpPrice();
//        }

//        #endregion

//        #region 股票交易

//        private static void _Execute()
//        {
//            lock (excuteLock)
//            {
//                WaitExecute = false;
//                var pools = GetPool();
//                //插入取消交易代码
//                _CancelTrade(pools);
//                var sellPools = pools.Where(c => c.TradeType == (int)TradeTypeEnum.Sell);
//                var buyPools = pools.Where(c => c.TradeType == (int)TradeTypeEnum.Buy);

//                while (true)
//                {
//                    var sell = sellPools.Where(c => c.AgencyCount > 0).FirstOrDefault();
//                    if (sell == null)
//                    {
//                        //无卖出
//                        //启动定时涨价。
//                        MarketManager.UpPriceStart();
//                        break;
//                    }
//                    var buy = buyPools.Where(c => c.AgencyCount > 0 & c.AgencyPrice == sell.AgencyPrice).FirstOrDefault();

//                    MarketManager.UpPriceStop();

//                    if (buy == null)
//                    {
//                        //无购买
//                        break;
//                    }
//                    if (sell.AgencyPrice != buy.AgencyPrice)
//                    {
//                        //不能配对，跳出
//                        break;
//                    }
//                    PairTrade(sell, buy);
//                }
//                if (WaitExecute)
//                {
//                    _Execute();
//                }
//            }
//        }

//        /// <summary>
//        /// 配对,返回是否继续配对
//        /// </summary>
//        private static void PairTrade(StkWaitbargainpool sell, StkWaitbargainpool buy)
//        {
//            UnitOfWork work = new UnitOfWork();
//            try
//            {
//                BargainAgencyRepository agencyRep = new BargainAgencyRepository();
//                decimal price = buy.AgencyPrice;
//                decimal count = sell.AgencyCount > buy.AgencyCount ? buy.AgencyCount : sell.AgencyCount;

//                #region 更改卖出信息

//                sell.AgencyCount -= count;
//                if (sell.AgencyCount == 0)
//                {
//                    rep.Delete(sell.Id, work);
//                }
//                else
//                {
//                    rep.Update(sell, work);
//                }
//                BargainFacility sellFacility = new BargainFacility(sell.AgencyId, price, count);
//                sellFacility.Execute(work);

//                #endregion

//                #region 更改买入信息

//                buy.AgencyCount -= count;
//                if (buy.AgencyCount == 0)
//                {
//                    rep.Delete(buy.Id, work);
//                }
//                else
//                {
//                    rep.Update(buy, work);
//                }

//                BargainFacility buyFacility = new BargainFacility(buy.AgencyId, price, count);
//                buyFacility.Execute(work);

//                #endregion

//                work.Commit();
//            }
//            catch (Exception exp)
//            {
//                work.Rollback();
//            }
//        }

//        static WaitBargainPoolRepository rep = new WaitBargainPoolRepository();
//        static IEnumerable<StkWaitbargainpool> GetPool()
//        {
//            return rep.GetAll();
//        }


//        #endregion

//        #region 价格维护

//        private const decimal UpUnit = 0.001;
//        private static MarketRepository marketRepository = new MarketRepository();
//        private static StkMarket market;
//        public static StkMarket Market
//        {
//            get { return market ?? (market = marketRepository.Unique()); }
//        }

//        static void _UpPrice()
//        {
//            Market.CurrentPrice += UpUnit;
//            marketRepository.Update(market);
//        }

//        #endregion

//        #region 撤单

//         static System.Collections.Generic.Queue<string> cancelQueue = new Queue<string>();
//        public static void CancelTrade(string agencyId)
//        {
//            lock (cancelLock)
//            {
//                cancelQueue.Enqueue(agencyId);
//                Execute();
//            }
//        }

//        public static void _CancelTrade(IEnumerable<StkWaitbargainpool> pools)
//        {
//            //真正的撤单
//            lock (cancelLock)
//            {
//                foreach(string c in cancelQueue)
//                {
//                    var pool = pools.Where(m => m.AgencyId == c).FirstOrDefault();
//                    if(pool!= null && pool.AgencyCount>0)
//                    {
//                        CancelTradeFacility cf = new CancelTradeFacility(pool);
//                        cf.Execute();
//                    }
//                }
//            }

//        }

//        #endregion
//    }
//}
